/*
**    Copyright (C) 2003-2011 Institute for Systems Biology
**                            Seattle, Washington, USA.
**
**    This library is free software; you can redistribute it and/or
**    modify it under the terms of the GNU Lesser General Public
**    License as published by the Free Software Foundation; either
**    version 3 of the License, or (at your option) any later version.
**
**    This library is distributed in the hope that it will be useful,
**    but WITHOUT ANY WARRANTY; without even the implied warranty of
**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**    Lesser General Public License for more details.
**
**    You should have received a copy of the GNU Lesser General Public
**    License along with this library; if not, write to the Free Software
**    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

package org.systemsbiology.iteration;

import java.util.Iterator;
import java.util.NoSuchElementException;

public abstract class BatchIterator<In, Out> implements Iterator<Out> {

	private Iterator<Out> cache = new EmptyIterator<Out>();
	private Iterator<In> source = null;
	
	public BatchIterator(Iterator<In> source){
		this.source = source;
	}
	
	public boolean hasNext(){
		if(cache.hasNext()){ return true;}
		while(source.hasNext()){
			cache = nextBatch(source.next());
			if(cache != null){
				if(cache.hasNext()){return true;}
			}
		}
		//exhausted
		cache = new EmptyIterator<Out>();
		return false;
	}
	
	public Out next(){
		if(cache.hasNext()){
			return cache.next();
		}
		
		while(source.hasNext()){
			cache = nextBatch(source.next());
			if(cache != null){
				if(cache.hasNext()){return cache.next();}
			}
		}
		throw new NoSuchElementException("BatchIterator empty");
	}
	
	public void remove(){
		throw new UnsupportedOperationException("ForwardCachedIterator does not support remove()");
	}
	
	protected abstract Iterator<Out> nextBatch(In next);
}
